package com.da.springtest.configuration;

import java.util.Arrays;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * 被@Configuration修饰的类，spring容器中会通过cglib给这个类创建一个代理，
 * 代理会拦截所有被@Bean修饰的方法，默认情况（bean为单例）下确保这些方法只被调用一次，
 * 从而确保这些bean是同一个bean，即单例的。
 *
 * 加@Configuration注解修饰的类，会被spring通过cglib做增强处理，通过cglib会生成一个代理对象，
 * 代理会拦截所有被@Bean注解修饰的方法，可以确保一些bean是单例的
 *
 * 不管@Bean所在的类上是否有@Configuration注解，都可以将@Bean修饰的方法作为一个bean注册到spring容器中
 */
public class ConfigurationTest {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConfigBean.class);
        show(context);

        System.out.println("--------------------------------");

        AnnotationConfigApplicationContext context1 = new AnnotationConfigApplicationContext(ConfigBean1.class);
        show(context1);

        System.out.println("--------------------------------");

        AnnotationConfigApplicationContext context2 = new AnnotationConfigApplicationContext(ConfigBean2.class);
        show(context2);
    }

    private static void show(AnnotationConfigApplicationContext context) {
        for (String beanName : context.getBeanDefinitionNames()) {
            //别名
            String[] aliases = context.getAliases(beanName);
            System.out.println(String.format("bean名称:%s,别名:%s,bean对象:%s",
                beanName,
                Arrays.asList(aliases),
                context.getBean(beanName)));
        }
    }
}